package com.fun.demo.fun;

import java.util.NoSuchElementException;
import java.util.Optional;

public class OptionalExample {

    public static void main(String[] args) {
        // 创建 Optional 实例
        Integer value = 10;
        Optional<Integer> optionalValue = Optional.of(value); // 当 value 不为 null 时使用

        Integer nullValue = null;
        Optional<Integer> optionalNullValue = Optional.ofNullable(nullValue); // 当 value 可能为 null 时使用

        Optional<Integer> emptyOptional = Optional.empty(); // 直接创建一个空的 Optional

        // 判断 Optional 是否有值
        boolean hasValue = optionalValue.isPresent(); // true
        boolean hasNoValue = optionalNullValue.isPresent(); // false

        // 获取 Optional 中的值
        try {
            int intValue = optionalValue.get(); // 10
            System.out.println("intValue: " + intValue);
        } catch (NoSuchElementException e) {
            System.out.println("No value present");
        }

        int defaultValue = optionalNullValue.orElse(0); // 0
        System.out.println("defaultValue: " + defaultValue);

        int defaultSupplierValue = optionalNullValue.orElseGet(() -> 0); // 0
        System.out.println("defaultSupplierValue: " + defaultSupplierValue);

        try {
            int throwValue = optionalNullValue.orElseThrow(() -> new RuntimeException("No value present"));
            System.out.println("throwValue: " + throwValue);
        } catch (RuntimeException e) {
            System.out.println(e.getMessage()); // No value present
        }

        // 对 Optional 进行过滤和转换
        Optional<Integer> filteredValue = optionalValue.filter(v -> v > 5); // Optional[10]
        System.out.println("filteredValue: " + filteredValue);

        Optional<String> stringOptional = optionalValue.map(v -> String.valueOf(v)); // Optional["10"]
        System.out.println("stringOptional: " + stringOptional);

        Optional<Optional<Integer>> nestedOptional = Optional.of(Optional.of(10));
       // Optional<Integer> flatMappedValue = nestedOptional.flatMap(Optional::ofNullable); // Optional[10]
       // System.out.println("flatMappedValue: " + flatMappedValue);

        // 使用 ifPresent 和 ifPresentOrElse
        optionalValue.ifPresent(System.out::println); // 输出 10

//        optionalNullValue.ifPresentOrElse(
//                System.out::println,
//                () -> System.out.println("No value present")
//        ); // 输出 "No value present"
    }
}

